
import jsMobileDetect from './js-mobile-detect'

const TAG = 'js-bridge-client'

const JSBridgeClient = {
  checkIsJSON(response, command) {
    if (typeof response === 'string') {
      try {
        // https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse
        const tmp = JSON.parse(response)
        if (typeof tmp === 'object') {
          return tmp
        }
      } catch (e) {
        console.log(`解析客户端桥接【${command.event}#${command.action}】返回的字符串响应数据出错，一般为数据格式不正确，不是一个标准JSON字面量`)
      }
    }
    console.log(`客户端桥接【${command.event}#${command.action}】返回的数据格式不正确，不是一个标准JSON字面量`)
  },

  parseRespData(response, command) {
    return new Promise((resolve, reject) => {
      let data
      try {
        data = this.checkIsJSON(response, command)
      } catch (e) {
        reject(e)
        return
      }
      // if (typeof this.onFulfilled4Resp === 'function') {
      //   // step2 如果应用配置全局响应处理器，那么桥接处理将交给应用自己决策
      //   // consistent-return http://nodejs.cn/eslint/rules/consistent-return/
      //   this.onFulfilled4Resp(data)
      //     .then((res) => {
      //       data = res
      //       console.log(
      //         TAG,
      //         // ⚠️ 方便客户端日志查看，调试的时候开启
      //         // eslint-disable-next-line prettier/prettier
      //         `${command.event}#${command.action} bridge onFulfilled4Resp return is:\n ${JSON.stringify(data)}`
      //       )
      //       resolve(data)
      //     })
      //     .catch(reject)
      //   return
      // }
      // step1 未配置自定义处理器，直接响应成功
      console.log(
        TAG,
        // eslint-disable-next-line prettier/prettier
        `${command.event}#${command.action} bridge parseRespData return is:\n ${JSON.stringify(data)}`
      )
      resolve(data)
    })
  },

  /**
   * 协议方式请求客户端
   * command的格式：
   *  const command = {
   *    event: 'test',
   *    action: 'TestCallBack',
   *    params: {
   *      ...
   *    }
   *  }
   *  @param  {Object} [command=null] 客户端所需的调用消息
   */
  bridge(context = '', command = null) {
    return new Promise((resolve, reject) => {
      console.log(
        TAG,
        `发送到客户端指令 command 参数是:\n ${JSON.stringify(command)}`
      )
      let response = null
      if (jsMobileDetect.isAndroid()) {
        // event 是硬编码, android 参考webView.evaluateJavascript方法
        // 参考客户端：@JavascriptInterface public String event(String params)
        try {
          // step1 起
          // ⚠️ 发送到客户端的是字符串类型的json 字面量
          // ⚠️ 客户端返回的是字符串类型的json 字面量
          response = window[context].event(JSON.stringify(command))
        } catch (e) {
          reject(e)
          // ⚠️ 如何处理 promise的返回 http://nodejs.cn/eslint/rules/no-promise-executor-return/
          return
        }
        console.log(
          TAG,
          `${context}#${command.action} bridge callback, android origin return is:\n ${response}`
        )
        // step2 终
        this.parseRespData(response, command)
          .then(resolve)
          .catch(reject)
        // ⚠️ 处理完毕
        return
      }

      if (jsMobileDetect.isIos()) {
        window.webkit.messageHandlers[context].postMessage(JSON.stringify(command))
      }
    })
  }
}

export default JSBridgeClient;
